// JavaScript的Array可以包含任意数据类型，并通过索引来访问每个元素。

function test1() {
    var arr = [1, 2, 3.14, 'Hello', null, true];
    console.log(arr.length);
    arr.length = 6;
    // arr变为[1, 2, 3, undefined, undefined, undefined]
    console.log(arr.toString());
    arr.length = 2;
    // arr变为[1, 2]
    console.log(arr.toString());
}

function test2() {
    //数组可以通过索引把对应的元素修改为新的值，因此，对数组的索引进行赋值会直接修改这个Array：
    var arr = ['A', 'B', 'C'];
    arr[1] = 99;
    console.log(arr.toString());
    // 如果通过索引赋值时，索引超过了范围，同样会引起Array大小的变化：
    arr[5] = 10;
    console.log(arr.toString());
    // 大多数其他编程语言不允许直接改变数组的大小，越界访问索引会报错。然而，JavaScript的Array却不会有任何错误。在编写代码时，不建议直接修改Array的大小，访问索引时要确保索引不会越界。
}

// indexOf
function test3() {
    // 与String类似，Array也可以通过indexOf()来搜索一个指定的元素的位置：
    var arr = [10, 20, '30', 'xyz'];
    console.log(arr.indexOf(10));// 返回0
    console.log(arr.indexOf("123"));// 返回-1

}

// slice()就是对应String的substring()版本，它截取Array的部分元素，然后返回一个新的Array：
function testSlice() {
    var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
    var arr1 = arr.slice(0, 3); // 从索引0开始，到索引3结束，但不包括索引3: ['A', 'B', 'C']
    console.log(arr1.toString());
    var arr2 = arr.slice(3);// 从索引3开始到结束: ['D', 'E', 'F', 'G']
    console.log(arr2.toString());
    // 注意到slice()的起止参数包括开始索引，不包括结束索引。
    // 如果不给slice()传递任何参数，它就会从头到尾截取所有元素。利用这一点，我们可以很容易地复制一个Array：
    var acopy = arr.slice();
    console.log(acopy);
}

// push和pop
function pushAndpop() {
    //push()向Array的末尾添加若干元素，pop()则把Array的最后一个元素删除掉：
    var arr = [1, 2];
    console.log(arr);
    arr.push('A', 20);
    console.log(arr);
    var testStr = arr.pop();// pop()返回'B'
    console.log(testStr);
    console.log(arr);
}

// unshift和shift
function unshiftAndshift() {
    // 如果要往Array的头部添加若干元素，使用unshift()方法，shift()方法则把Array的第一个元素删掉：
    var arr = [1, 2];
    console.log(arr);
    arr.unshift('A', 'B');
    console.log(arr);
    var testStr = arr.shift();
    console.log(testStr);
    console.log(arr);
    // 空数组继续shift不会报错，而是返回undefined
}

// sort()可以对当前Array进行排序，它会直接修改当前Array的元素位置，直接调用时，按照默认顺序排序：
function testSort() {
    var arr = ['B', 'C', 'A'];
    console.log("排序前：");
    console.log(arr);
    console.log("排序后：");
    // 默认排序
    arr.sort();
    console.log(arr);
    // 按照我们自己指定的顺序排序呢？完全可以，我们将在后面的函数中讲到。
}

// reverse()把整个Array的元素给掉个个，也就是反转：
function testReverse() {
    var arr = ['one', 'two', 'three'];
    console.log(arr);
    arr.reverse();
    console.log(arr);

}

// splice()方法是修改Array的“万能方法”，它可以从指定的索引开始删除若干元素，然后再从该位置添加若干元素：
function testSplice() {
    var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
    console.log(arr);
    // / 从索引2开始删除3个元素,然后再添加两个元素:
    arr.splice(2, 3, 'Google', 'Facebook');
    console.log(arr);
}

// concat()方法把当前的Array和另一个Array连接起来，并返回一个新的Array：
function testConcat() {
    var arr = ['A', 'B', 'C'];
    console.log("原来的数组：");
    console.log(arr);
    var added = arr.concat([1, 2, 3]);
    console.log(added);
}

// join()方法是一个非常实用的方法，它把当前Array的每个元素都用指定的字符串连接起来，然后返回连接后的字符串：
function testJoin() {
    // 如果Array的元素不是字符串，将自动转换为字符串后再连接
    var arr = ['A', 'B', 'C', 1, 2, 3];
    console.log("数组为：");
    console.log(arr);
    console.log("处理之后：");
    console.log(arr.join('-'));
}

function testArrays() {
    var arr = [[1, 2, 3], [400, 500, 600], '-'];
    console.log(arr);

}